"use strict";
/** Promise
 * 详细文档：https://es6.ruanyifeng.com/#docs/promise
 *
 * 1.创建 Promise 对象传递一个函数, 在函数里执行异步操作
 * 2.Promise对象 then 方法，异步操作后执行 resolve() 调用
 * 3.then：两个参数(成功回调(resolve), 失败回调(reject))
 * 4.catch：处理上面的异常
 * 5.all：执行 all 异步函数完成在执行 then
 * 6.api: then、Promise.all、Promise.race
 */
Object.defineProperty(exports, "__esModule", { value: true });
var MPromiseInstance = /** @class */ (function () {
    function MPromiseInstance() {
    }
    MPromiseInstance.prototype.initMPromise = function () {
        console.log('-------- promise --------');
        // this.test1();
        // this.test2();
        // this.test3();
        // this.test4();
        // this.test5();
        // this.test6();
        // this.test7();
        this.test8();
    };
    // 1.简单使用: rejected、resolve => then
    MPromiseInstance.prototype.test1 = function () {
        this.test1_p().then(function (data) {
            console.log(data); //resolve=>data: '执行完异步方法 resolve'
        }, function (data) {
            console.log(data); //rejected=>data: '执行完异步方法 reject'
        });
    };
    MPromiseInstance.prototype.test1_p = function () {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                //只能执行一个
                // resolve('执行完异步方法 resolve');
                reject('执行完异步方法 reject');
            }, 1000);
        });
        return p;
    };
    // 2.指定参数类型 number: Promise<number>
    MPromiseInstance.prototype.test2 = function () {
        this.test2_p().then(function (num) {
            console.log('执行带参数的异步：' + num);
        });
    };
    MPromiseInstance.prototype.test2_p = function () {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve(1234);
                // 报错: <number> 约定必须 number
                // resolve('1234');
            }, 1000);
        });
        return p;
    };
    // 3.链式操作：函数1异步执行完->执行函数2异步执行完->执行函数3异步执行
    // 实现：then函数里返回 Promise 对象
    MPromiseInstance.prototype.test3 = function () {
        //异步任务1执行完成 随便什么数据1
        //异步任务2执行完成 随便什么数据2
        //异步任务3执行完成 随便什么数据3
        var t = this;
        this.runAsync1().then(function (data) {
            console.log(data);
            return t.runAsync2();
        }).then(function (data) {
            console.log(data);
            return t.runAsync3();
        }).then(function (data) {
            console.log(data);
        });
    };
    MPromiseInstance.prototype.runAsync1 = function () {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log('异步任务1执行完成');
                resolve('随便什么数据1');
            }, 1000);
        });
        return p;
    };
    MPromiseInstance.prototype.runAsync2 = function () {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log('异步任务2执行完成');
                resolve('随便什么数据2');
            }, 1000);
        });
        return p;
    };
    MPromiseInstance.prototype.runAsync3 = function () {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log('异步任务3执行完成');
                resolve('随便什么数据3');
            }, 1000);
        });
        return p;
    };
    // 4.then 函数可返回非 Promise 对象
    MPromiseInstance.prototype.test4 = function () {
        var t = this;
        this.runAsync1().then(function (data) {
            console.log(data);
            return t.runAsync2();
        }).then(function (data) {
            console.log(data);
            return '直接返回数据'; //这里直接返回数据
        }).then(function (data) {
            console.log(data);
        });
    };
    // 5.catch：
    // (1)then的第二个参数一样
    // (2)类似 try catch
    MPromiseInstance.prototype.test5 = function () {
        console.log(Number('12a'));
        this.test5_p().then(function (data) {
            //如果这里发生异常 跳到 catch
        }).catch(function (reason) {
            //处理上面发生的异常
        });
    };
    MPromiseInstance.prototype.test5_p = function () {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve(1234);
            }, 1000);
        });
        return p;
    };
    // 6.all：asy1、asy2、asy3、都执行完才执行 all 的 then
    // asy1、asy2、asy3 同时执行
    MPromiseInstance.prototype.test6 = function () {
        var t = this;
        Promise.all([t.runAsync1(), t.runAsync2(), t.runAsync3()]).then(function (results) {
            console.log(results);
        });
    };
    // 7.race：跟 all 不同之处, runAsync1 执行完可能就执行 then 了
    // 不需要等 asy1、asy2、asy3  都执行完, 只要有一个执行完即可
    MPromiseInstance.prototype.test7 = function () {
        var t = this;
        Promise.race([t.runAsync1(), t.runAsync2(), t.runAsync3()]).then(function (results) {
            console.log(results);
        });
    };
    // 8.Promise.resolve
    // 输出：1.done、2.done2
    MPromiseInstance.prototype.test8 = function () {
        Promise.resolve('done').then(function (val) {
            console.log('1.' + val);
            return 'done2';
        }).then(function (val) { return console.log('2.' + val); }, function (err) { return console.error(err); });
    };
    MPromiseInstance.Instance = new MPromiseInstance();
    return MPromiseInstance;
}());
exports.MPromise = MPromiseInstance.Instance;
